* ExecuteBufferDataExtractionWorker, forwarding template types and parameters.
*/
template <typename ArrayType, typename vtkArrayDispatchType>
- void DispatchWorkerExecutionByComponentType(
+ bool DispatchWorkerExecutionByComponentType(
ArrayType* output, const Accessor& accessor, const BufferView& bufferView)
{
switch (accessor.ComponentTypeValue)
{
case ComponentType::BYTE:
- this->ExecuteBufferDataExtractionWorker<char, ArrayType, vtkArrayDispatchType>(
+ return this->ExecuteBufferDataExtractionWorker<char, ArrayType, vtkArrayDispatchType>(
output, accessor, bufferView);
- break;
case ComponentType::UNSIGNED_BYTE:
- this->ExecuteBufferDataExtractionWorker<unsigned char, ArrayType, vtkArrayDispatchType>(
+ return this->ExecuteBufferDataExtractionWorker<unsigned char, ArrayType, vtkArrayDispatchType>(
output, accessor, bufferView);
- break;
case ComponentType::SHORT:
- this->ExecuteBufferDataExtractionWorker<short, ArrayType, vtkArrayDispatchType>(
+ return this->ExecuteBufferDataExtractionWorker<short, ArrayType, vtkArrayDispatchType>(
output, accessor, bufferView);
- break;
case ComponentType::UNSIGNED_SHORT:
- this->ExecuteBufferDataExtractionWorker<uint16_t, ArrayType, vtkArrayDispatchType>(
+ return this->ExecuteBufferDataExtractionWorker<uint16_t, ArrayType, vtkArrayDispatchType>(
output, accessor, bufferView);
- break;
case ComponentType::UNSIGNED_INT:
- this->ExecuteBufferDataExtractionWorker<uint32_t, ArrayType, vtkArrayDispatchType>(
+ return this->ExecuteBufferDataExtractionWorker<uint32_t, ArrayType, vtkArrayDispatchType>(
output, accessor, bufferView);
- break;
case ComponentType::FLOAT:
- this->ExecuteBufferDataExtractionWorker<float, ArrayType, vtkArrayDispatchType>(
+ return this->ExecuteBufferDataExtractionWorker<float, ArrayType, vtkArrayDispatchType>(
output, accessor, bufferView);
- break;
default:
- return;
+ return false;
}
}
* forwarding template types and parameters.
*/
template <typename ArrayType>
- void DispatchWorkerExecution(
+ bool DispatchWorkerExecution(
ArrayType* output, const Accessor& accessor, const BufferView& bufferView)
{
if (accessor.Normalized || accessor.ComponentTypeValue == ComponentType::FLOAT)
{
- this->DispatchWorkerExecutionByComponentType<ArrayType, vtkArrayDispatch::Reals>(
+ return this->DispatchWorkerExecutionByComponentType<ArrayType, vtkArrayDispatch::Reals>(
output, accessor, bufferView);
}
else
{
- this->DispatchWorkerExecutionByComponentType<ArrayType, vtkArrayDispatch::Integrals>(
+ return this->DispatchWorkerExecutionByComponentType<ArrayType, vtkArrayDispatch::Integrals>(
output, accessor, bufferView);
}
}
* Creates a new BufferDataExtractionWorker, initializes it and starts its execution
*/
template <typename ComponentType, typename ArrayType, typename vtkArrayDispatchType>
- void ExecuteBufferDataExtractionWorker(
+ bool ExecuteBufferDataExtractionWorker(
ArrayType* output, const Accessor& accessor, const BufferView& bufferView)
{
+ if (bufferView.Buffer < 0 || bufferView.Buffer >= static_cast<int>(this->Buffers->size()))
+ {
+ vtkErrorWithObjectMacro(nullptr, "Invalid buffer index:" << bufferView.Buffer);
+ return false;
+ }
+
// Create worker
BufferDataExtractionWorker<ComponentType> worker;
// Set worker parameters
// Start worker execution
vtkArrayDispatch::DispatchByValueType<vtkArrayDispatchType>::Execute(output, worker);
+ return true;
}
void Setup(int accessorId, vtkGLTFDocumentLoader::AccessorType expectedType)
}
// Load base accessor data
- if (accessor.BufferView >= 0)
+ if (accessor.BufferView >= 0 &&
+ accessor.BufferView < static_cast<int>(this->BufferViews->size()))
{
const BufferView& bufferView = this->BufferViews->operator[](accessor.BufferView);
output->SetNumberOfComponents(GetNumberOfComponentsForType(this->ExpectedType));
- DispatchWorkerExecution<ArrayType>(output, accessor, bufferView);
+ if (!DispatchWorkerExecution<ArrayType>(output, accessor, bufferView))
+ {
+ this->Result = false;
+ return;
+ }
}
else if (!accessor.IsSparse)
{
mockIndicesAccessor.NumberOfComponents = 1;
mockIndicesAccessor.ComponentTypeValue = sparse.IndicesComponentType;
- DispatchWorkerExecution<vtkIntArray>(sparseIndices, mockIndicesAccessor, indicesBufferView);
+ if (!DispatchWorkerExecution<vtkIntArray>(
+ sparseIndices, mockIndicesAccessor, indicesBufferView))
+ {
+ this->Result = false;
+ return;
+ }
// Load values
vtkNew<ArrayType> sparseValues;
mockValuesAccessor.Count = sparse.Count;
mockValuesAccessor.ByteOffset = sparse.ValuesByteOffset;
- DispatchWorkerExecution<ArrayType>(
- sparseValues.GetPointer(), mockValuesAccessor, valuesBufferView);
+ if (!DispatchWorkerExecution<ArrayType>(
+ sparseValues.GetPointer(), mockValuesAccessor, valuesBufferView))
+ {
+ this->Result = false;
+ return;
+ }
// Replace values into original (non sparse) array
for (int id = 0; id < sparseIndices->GetNumberOfValues(); id++)